home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / Aminet / disk / misc / TransADF.lha / Source / infl_disk.c < prev    next >
C/C++ Source or Header  |  1997-12-05  |  7KB  |  234 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <devices/trackdisk.h>
  4. #include <dos/dos.h>
  5. #include <clib/exec_protos.h>
  6. #include <clib/dos_protos.h>
  7.  
  8. #include "zlib.h"
  9.  
  10. #include "infl_disk.h"
  11. #include "main.h"
  12. #include "td.h"
  13. #include "util.h"
  14. #include "errors.h"
  15.  
  16.  
  17. #define ID_FBSIZE   (32*1024)                   /* Bytes in id_FileBuf   */
  18. #define ID_TBTRACKS 1                           /* Tracks in id_TrackBuf */
  19. #define ID_TBSIZE   (ID_TBTRACKS * TRACK_SIZE)  /* Bytes in id_TrackBuf  */
  20.  
  21. UBYTE *id_FileBuf;     /* Our input buffer - reads from file. */
  22. UBYTE *id_TrackBuf;    /* Our output buffer - writes to disk. */
  23.  
  24.  
  25. /*
  26. ** Inflate a file into a disk.
  27. ** Expects all fields of adfPkt to be set.
  28. */
  29. void inflDisk (struct ADF_Packet *adfPkt, STRPTR origName, ULONG fileType)
  30. {
  31.   static z_stream infl_stream;
  32.   ULONG nextTrack, CRC, USize, origCRC, origUSize;
  33.   LONG DOSError;
  34.   BYTE TDError;
  35.   int zerr, winbits;
  36.   
  37.   
  38.   /* Output info header */
  39.   FPrintf (StdErr, "Inflating from %s to TrackDisk Unit %ld (DF%ld:).\n",
  40.                    adfPkt->ADFileName,
  41.                    adfPkt->diskUnit,
  42.                    adfPkt->diskUnit);
  43.   
  44.   FPrintf (StdErr, "Starting at track %ld, Ending at track %ld.\n",
  45.                    (adfPkt->startTrack>>1),
  46.                    (adfPkt->endTrack>>1));
  47.   
  48.   FPuts (StdOut, "Input is a ");
  49.   switch (fileType) {
  50.   case FT_ZLIB:  FPuts (StdOut, "ZLib");  break;
  51.   case FT_GZIP:  FPuts (StdOut, "GZip");  break;
  52.   case FT_PKZIP: FPuts (StdOut, "PKZip"); break;
  53.   }
  54.   FPuts (StdOut, " file, decompressing.\n");
  55.   
  56.   
  57.   /* Allocate the buffers */
  58.   id_TrackBuf = (UBYTE *)AllocVec (ID_TBSIZE, MEMF_CLEAR);
  59.   id_FileBuf  = (UBYTE *)AllocVec (ID_FBSIZE, MEMF_CLEAR);
  60.   if (!id_TrackBuf || !id_FileBuf)
  61.   {
  62.     /* No Memory */
  63.     FPrintf (StdErr, "%s: Out of memory.\n", ProgName);
  64.     cleanExit(RETURN_FAIL, ERROR_NO_FREE_STORE);
  65.   }
  66.   
  67.   /* Consume file header */
  68.   if (skipHead (adfPkt->ADFile, origName, fileType) == FALSE)
  69.   {
  70.     DOSError = IoErr();
  71.     
  72.     FPrintf (StdErr, "%s: Couldn't read file header.\n",ProgName);
  73.     
  74.     if (DOSError)
  75.       reportDOSError (DOSError);
  76.     
  77.     cleanExit (RETURN_FAIL, NULL);
  78.   }
  79.   
  80.   
  81.   /* Initialise the z_stream */
  82.   if (fileType == FT_ZLIB) winbits = 15;
  83.   else winbits = -15; /* windowBits is passed < 0 to suppress zlib header */    
  84.   infl_stream.zalloc = Z_NULL;
  85.   infl_stream.zfree  = Z_NULL;
  86.   infl_stream.opaque = Z_NULL;
  87.   zerr = inflateInit2 (&infl_stream, winbits);
  88.   if (zerr != Z_OK)
  89.   {
  90.     FPrintf (StdErr, "%s: Inflate Init Error - ", ProgName);
  91.     reportZLibError (zerr);
  92.     if (infl_stream.msg) FPrintf (StdErr, "\t(%s)\n", infl_stream.msg);
  93.     cleanExit (RETURN_FAIL, NULL);
  94.   }
  95.   
  96.   /* Start inflating */
  97.   infl_stream.avail_in  = 0;            /* Input buffer is empty    */
  98.   infl_stream.next_out  = id_TrackBuf;  /* Pointer to output buffer */
  99.   infl_stream.avail_out = ID_TBSIZE;    /* output buffer is empty   */
  100.   CRC = crc32 (NULL, Z_NULL, 0);        /* Initialise the CRC       */
  101.   nextTrack = adfPkt->startTrack;
  102.   for (;;)
  103.   {
  104.     if (infl_stream.avail_in == 0)  /* Input is empty */
  105.     {
  106.       /* Fill the input buffer from file */
  107.       infl_stream.next_in  = id_FileBuf;
  108.       infl_stream.avail_in = Read (adfPkt->ADFile, id_FileBuf, ID_FBSIZE);
  109.       if (infl_stream.avail_in == 0)
  110.       {
  111.         FPrintf (StdErr, "%s: Error - Unexpected End-Of-File.\n", ProgName);
  112.         cleanExit (RETURN_ERROR, NULL);
  113.       }
  114.     }
  115.     
  116.     /* Fill the output buffer with inflated data */
  117.     for (;;)
  118.     {
  119.       /* Check for Control-C break */
  120.       if (CTRL_C)
  121.       {
  122.         FPutC (StdOut, '\n');
  123.         FPrintf (StdErr, "%s - %s\n", breakText, ProgName);
  124.         inflateEnd (&infl_stream);
  125.         cleanExit (RETURN_WARN, NULL);
  126.       }
  127.       
  128.       /* Upate progress report */
  129.       FPuts (StdErr, "\rInflating ");
  130.       Flush (StdErr);
  131.       
  132.       zerr = inflate (&infl_stream, Z_NO_FLUSH);
  133.       if (zerr < Z_OK)
  134.       {
  135.         FPutC (StdOut, '\n');
  136.         FPrintf (StdErr, "%s: Inflate error - ", ProgName);
  137.         reportZLibError (zerr);
  138.         if (infl_stream.msg) FPrintf (StdErr, "\t%s\n", infl_stream.msg);
  139.         inflateEnd (&infl_stream);
  140.         cleanExit (RETURN_FAIL, NULL);
  141.       }
  142.       
  143.       /* Only flush the output buffer when it is completely full */
  144.       if (infl_stream.avail_out == 0)
  145.       {
  146.         if (nextTrack <= adfPkt->endTrack)
  147.         {
  148.           /* Update the CRC */
  149.           CRC = crc32 (CRC, id_TrackBuf, ID_TBSIZE);
  150.           
  151.           /* Update progress report */
  152.           FPuts (StdOut, "\rWriting   ");
  153.           FPUTS_TS (nextTrack, StdOut);
  154.           Flush (StdOut);
  155.           
  156.           /* Write to the disk */
  157.           TDError = writeTrack (id_TrackBuf, ID_TBTRACKS, nextTrack,
  158.                                 adfPkt->diskReq);
  159.           if (TDError)
  160.           {
  161.             FPutC (StdOut, '\n');
  162.             FPrintf (StdErr, "%s: Error writing to DF%ld: - ",
  163.                              ProgName,adfPkt->diskUnit);
  164.             reportTDError (TDError);
  165.             inflateEnd (&infl_stream);
  166.             cleanExit (RETURN_FAIL, NULL);
  167.           }
  168.           infl_stream.next_out  = id_TrackBuf;
  169.           infl_stream.avail_out = ID_TBSIZE;
  170.           nextTrack++;
  171.         }
  172.         else
  173.           /* We've reached the end */
  174.           zerr = Z_STREAM_END;
  175.       }
  176.       else
  177.         /* The buffer is not full, move along */
  178.         break;
  179.       
  180.       if (zerr == Z_STREAM_END)
  181.         /* Reached endTrack, or we reached the end of the */
  182.         /* compressed data stream.                        */
  183.         break;
  184.     }
  185.     if (zerr == Z_STREAM_END) break;
  186.   }
  187.   USize = infl_stream.total_out;
  188.   
  189.   FPrintf (StdOut, "\rInflated: %ld ==> %ld         ", infl_stream.total_in,
  190.                                                        USize);
  191.   Flush (StdOut);
  192.   
  193.   /* End the deflate process */
  194.   zerr = inflateEnd (&infl_stream);
  195.   if (zerr != Z_OK)
  196.   {
  197.     FPutC (StdOut, '\n');
  198.     FPrintf (StdErr, "%s: Inflate End Error - ", ProgName);
  199.     reportZLibError (zerr);
  200.     if (infl_stream.msg) FPrintf (StdErr, "\t(%s)\n", infl_stream.msg);
  201.     cleanExit (RETURN_FAIL, NULL);
  202.   }
  203.   
  204.   /* Check the CRC and USize */
  205.   if ( readTail (adfPkt->ADFile, &origCRC, &origUSize, fileType) == FALSE)
  206.   {
  207.     FPutC (StdOut, '\n');
  208.     FPrintf (StdErr, "%s: Couldn't read CRC or Size from file.\n", 
  209.                      ProgName);
  210.     cleanExit (RETURN_FAIL, NULL);
  211.   }
  212.   
  213.   if (fileType != FT_ZLIB)
  214.   {
  215.     if (CRC != origCRC)
  216.     {
  217.       FPutC (StdOut, '\n');
  218.       FPuts (StdErr, "Error: CRC Mismatch!\n");
  219.       cleanExit (RETURN_ERROR, NULL);
  220.     }
  221.     
  222.     if (USize != origUSize)
  223.     {
  224.       FPutC (StdOut, '\n');
  225.       FPuts (StdErr, "Error: Size mismatch!\n");
  226.       cleanExit (RETURN_ERROR, NULL);
  227.     }
  228.   }
  229.   
  230.   /* Free and clear buffers */
  231.   FreeVec (id_TrackBuf); id_TrackBuf = NULL;
  232.   FreeVec (id_FileBuf); id_FileBuf = NULL;
  233. }
  234.